package com.toddding.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.toddding.domain.File;
import com.toddding.domain.Folder;
import com.toddding.mapper.FileMapper;
import com.toddding.mapper.FolderMapper;
import com.toddding.service.FolderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;


@Service
public class FolderServiceImpl implements FolderService {
    @Autowired
    private FolderMapper folderMapper;

    @Autowired
    private FileMapper fileMapper;

    /**
     * 分页查询文件夹
     *
     * @param keyWord 查询关键字
     * @param page    页码
     * @return
     */
    @Override
    public PageInfo<Folder> queryPage(String keyWord, Integer page) {
        Page<Folder> folderPage = PageHelper.startPage(page, 5);
        LambdaQueryWrapper<Folder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(Folder::getFolderName, keyWord).or().like(Folder::getFolderRemark, keyWord);
        this.folderMapper.selectList(queryWrapper);
        return folderPage.toPageInfo();
    }

    /**
     * 新增文件夹
     *
     * @param folder
     */
    @Override
    public void add(Folder folder) {
        this.folderMapper.insert(folder);
    }

    /**
     * 删除文件夹
     *
     * @param folderId
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Integer folderId) {
        // 删除文件夹
        this.folderMapper.deleteById(folderId);

        // 删除文件夹下面的文件
        /**
         * 1. 查询到文件夹下面的所有的文件
         * 2. 物理删除文件  10个文件   9个成功  1个失败  回滚
         *      1. 将文件移动到 删除的文件夹中
         *      2. 如果失败 则将文件移动回去
         * 3. 删除数据库数据
         */
        // 1.查找到文件夹下面所有的文件
        LambdaQueryWrapper<File> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(File::getFolderId, folderId);
        List<File> files = this.fileMapper.selectList(queryWrapper);
        if (files.isEmpty()) {
            return;
        }
        // 2.循环删除文件
        List<Integer> fileIds = new ArrayList<>();
        files.forEach(f -> {
            // 获取所有的文件 ID
            fileIds.add(f.getFileId());
            // 获取文件的物理路径
            String filePath = f.getFilePath();
            // 创建关联的文件对象
            java.io.File file = new java.io.File(filePath);
            // 判断文件是否存在
            if (file.exists()) {
                // 删除文件
                file.delete();
            }
        });

        // 3.删除数据库数据
        this.fileMapper.deleteBatchIds(fileIds);
    }

    /**
     * 根据 ID 查询文件夹信息
     *
     * @param folderId
     * @return
     */
    @Override
    public Folder query(Integer folderId) {
        Folder folder = this.folderMapper.selectById(folderId);
        return folder;
    }

    /**
     * 修改文件夹信息
     *
     * @param folder
     */
    @Override
    public void update(Folder folder) {
        this.folderMapper.updateById(folder);
    }

    /**
     * 查询所有的文件夹
     *
     * @return
     */
    @Override
    public List<Folder> queryFolders() {
        List<Folder> folders = this.folderMapper.selectList(null);
        return folders;
    }
}
